<?php
namespace app\modules\admin\controllers;

use app\models\ManagerLog;
use Yii;
use yii\db\Exception;
use yii\web\BadRequestHttpException;
use yii\web\ForbiddenHttpException;
use yii\web\ServerErrorHttpException;

/**
 * 数据库管理
 *
 * Class DbController
 * @package app\modules\admin\controllers
 */
class DbController extends BaseController
{
    /**
     * 执行SQL查询
     * @throws ForbiddenHttpException
     * @return string
     */
    public function actionSql()
    {
        if (!$this->manager->can('db/sql')) {
            throw new ForbiddenHttpException('没有权限。');
        }
        $sql = Yii::$app->request->post('sql');
        $affected = 0;
        $table = [];
        if (!empty($sql)) {
            try {
                if (preg_match('/^SELECT/i', $sql)) {
                    $table = Yii::$app->db->createCommand($sql)->queryAll();
                } else {
                    $affected = Yii::$app->db->createCommand($sql)->execute();
                }
                ManagerLog::info($this->manager->id, '', '执行SQL：' . $sql);
            } catch (Exception $error) {
                Yii::$app->session->addFlash('error', implode(' ', $error->errorInfo));
            }
        }
        return $this->render('sql', [
            'sql'=>$sql,
            'affected'=>$affected,
            'table'=>$table
        ]);
    }

    /**
     * 数据库备份
     * @throws ForbiddenHttpException
     * @throws BadRequestHttpException
     * @throws ServerErrorHttpException
     * @return string
     */
    public function actionBackup()
    {
        if (!$this->manager->can('db/backup')) {
            throw new ForbiddenHttpException('没有权限。');
        }
        $table_list = Yii::$app->db->schema->getTableNames();
        if ($this->isPost()) {
            switch (Yii::$app->request->post('backup_type')) {
                case 'all':
                    $backup_table_list = $table_list;
                    break;
                case 'standard':
                    $backup_table_list = [
                        // 系统相关
                        'system', // 系统设置
                        'ad_location', // 广告位
                        'ad', // 广告
                        'key_map', // 数据字典
                        'migration', // Yii2数据初始化记录
                        'sms', // 短信
                        'system_message', // 系统消息
                        'task', // 定时任务
                        'upload_file', // 上传文件

                        // 后台管理相关
                        'auth_assignment', // 权限分配
                        'auth_item', // 权限
                        'auth_item_child', // 权限上下级关系
                        'auth_rule', // 角色
                        'manager', // 管理员
                        'manager_role', // 管理员角色
                        'manager_log', // 管理日志

                        // 用户相关
                        'user', // 用户
                        'user_config', // 用户设置
                        'user_account', // 用户账户
                        'user_account_log', // 用户账户记录
                        'user_message', // 用户消息
                        'article_praise', // 资讯赞记录
                        'article_blame', // 资讯贬记录

                        // 资讯相关
                        'article', // 资讯
                        'article_category', // 资讯分类
                        'article_comment', // 资讯评论
                        'article_tag', // 资讯标签
                        'article_tag_map', // 资讯标签映射
                        'article_view_log', // 资讯访问记录
                    ];
                    break;
                case 'min':
                    $backup_table_list = [
                        // 系统相关
                        'system', // 系统设置
                        'ad', // 广告
                        'sms', // 短信
                        'system_message', // 系统消息
                        'task', // 定时任务
                        'upload_file', // 上传文件

                        // 后台管理相关
                        'auth_assignment', // 权限分配
                        'manager', // 管理员
                        'manager_role', // 管理员角色
                        'manager_log', // 管理日志

                        // 用户相关
                        'user', // 用户
                        'user_config', // 用户设置
                        'user_account', // 用户账户
                        'user_account_log', // 用户账户记录
                        'user_message', // 用户消息
                        'article_praise', // 用户赞记录
                        'article_blame', // 资讯贬记录

                        // 资讯相关
                        'article', // 资讯
                        'article_category', // 资讯分类
                        'article_comment', // 资讯评论
                        'article_share', // 资讯分享
                        'article_tag', // 资讯标签
                        'article_tag_map', // 资讯标签映射
                        'article_view_log', // 资讯访问记录
                    ];
                    break;
                case 'custom':
                    $backup_table_list = array_intersect($table_list, Yii::$app->request->post('backup_table'));
                    break;
                default:
                    throw new BadRequestHttpException('参数错误。');
            }
            if (!file_exists(Yii::$app->params['upload_path'] . '/database/')) {
                mkdir(Yii::$app->params['upload_path'] . '/database', 0777, true);
            }
            $backup_file = Yii::$app->params['upload_path'] . '/database/' . date('YmdHis') . '.sql';
            switch (Yii::$app->db->driverName) {
                case 'sqlite':
                    $db_file = substr(Yii::$app->db->dsn, 7);
                    foreach ($backup_table_list as $table) {
                        system('sqlite3 ' . $db_file . ' ".dump ' . $table . '" >> ' . $backup_file);
                    }
                    break;
                case 'mysql':
                    $db_name = preg_replace('/.*dbname=(.*)/', '$1', Yii::$app->db->dsn);
                    foreach ($backup_table_list as $table) {
                        system('mysqldump -u' . Yii::$app->db->username . ' -p' . Yii::$app->db->password . ' ' . $db_name . ' ' . $table . ' >> ' . $backup_file);
                    }
                    break;
                default:
                    throw new ServerErrorHttpException();
            }
            ManagerLog::info($this->manager->id, '', '备份数据库');
            Yii::$app->session->addFlash('success', '备份成功。<br /><ul><li><a href="/' . $backup_file . '">' . $backup_file . '</a></li></ul>');
        }
        return $this->render('backup', [
            'table_list'=>$table_list
        ]);
    }
}